如果依照前面講到的,self-attention只有vector之間的相關聯性,並沒有位置的資訊
那我們可以使用一個positional vector,,把這個加進,就可以將位置資訊加入input了
但是還有一個問題是,這個是人設定的,並不是自動產生的
在attention is all you need這篇論文中,只有用cos、sin的function來產生positional vector
但是在後續的一些論文中,有提出用不同的方法來產生出positional vector,但是目前並沒有說哪一個方法所產生出來的positional vector是最好的,因此對於自己要train的資料集,還是需要自己survey哪一個方法是最有用的
self-attention可以用在很多地方上面,現在比較多的應用都是在Natural Langue Processing(自然語言處理),比較常見的方法有兩個
由於之後主要會進入到實作的部分,在做推薦系統上面可能會有機會用到上面提到的這兩種方法,到時候再詳細解釋
如果我們是用self-attention來處理圖片會發生什麼事情呢?
self-attention是在一張圖片中的某一個pixel產生query,其他的pixel產生key,所以每一個pixel都會考慮到和整張圖片的相關聯性
但是CNN只會去考慮到影像中的receptive field,這個範圍可能是3x3的範圍
所以可以說CNN是簡化版的self-attention,而self-attention是比較複雜的CNN
這兩個model比較起來,如果self-attention的參數設定的好的話,是可以達到跟CNN一樣的效果的
由於self-attention是比較廣泛的CNN,而CNN是有受限制的self-attention
但是受限制的CNN在資料集比較小的時候反而效果比較好
而self-attention在資料集大的時候效果比較好
因此在圖像辨識上要使用self-attention或是CNN可以取決於資料集的大小
RNN也是要處理一個序列(Sequence)的input
這邊來簡單解釋一下RNN
一開始會有一個memory的vector,另外有一個RNN的model
第一個vector和memory的vector會被丟進RNN,RNN會產生一個hidden layer,在經過FC(全連階層)就可以得到第一個輸出
第二個輸出則是要將第一個hidden layer的資料跟第二個vector一起丟進RNN,再產生第二個hidden layer,經過FC(全連階層)得到第二個輸出
之後的都以此類推
那他們最主要的差別就是,RNN會因為傳遞的越多,導致資訊流失的越多,因此圖中右上方的黃色輸出是很難考慮到左下方的藍色輸入的
但是self-attention只需要藍色的輸入給一個query,黃色的輸入給一個key,做內積之後就會知道相似程度了,因此self-attention在考慮前面的輸入時,是處理的比較好的
另外一個大問題就是運算速度
由於前面有提到說self-attention是平行運算的,但是RNN要等到前面的輸出結果出來之後,才能夠再去做接續的動作,因此self-attention的運算速度是比較快的
今天將self-attention的部分講解完了,明天開始會講解如何使用azure來實作capsule跟self-attention,由於我沒有使用過azure,因此邊學邊寫文章吧